/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package userservercontroller;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Vector;
import repository.ByteArray;
import repository.exception.*;

/**
 *
 * @author Aleksey ID = 2001
 */
public interface IRepositoryClient extends Remote {
    /**
     * Запросить файлы и директории репозитория лежащие в папке relativePath
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория
     * @return вектор имен файлов
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public Vector<String> getFiles (long authorizationKey,String relativePath)
            throws RemoteException,WrongKeyExeption ;

    /**
     * Запросить файлы и директории репозитория лежащие в папке relativePath
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория
     * @param filter фильтр файлов
     * @return вектор имен файлов
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public Vector<String> getFiles (long authorizationKey, String relativePath,
            FilenameFilter filter) throws RemoteException,WrongKeyExeption ;

    /**
     * Запросить файлы и директории репозитория лежащие в папке relativePath
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория
     * @param filter фильтр файлов
     * @return массив файлов
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    /*public Vector<String> getFiles (long authorizationKey, String relativePath,
            FileFilter filter) throws RemoteException,WrongKeyExeption ;*/

    /**
     * Запросить файл репозитория
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория
     * @param filter фильтр файлов
     * @return файл
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    /*public String getFile (long authorizationKey, String relativePath)
           throws RemoteException,WrongKeyExeption ;*/

    /**
     * Скачать файл
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return массив байт, если файла не существует или
     * relativePath - директория возвращает null;
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     * @throws java.io.IOException ошибка чтения файла
     */
    public ByteArray downloadFile (long authorizationKey,String relativePath)
            throws IOException,RemoteException,WrongKeyExeption ;
    
    /**
     * Загрузить файл в репозиторий
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @param array массив байт
     * @return true в случае успеха, иначе false
     * @throws java.io.IOException ошибка чтения файла
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     * @throws repository.exception.FileSizeException превышен размер файла
     * @throws repository.exception.RepositorySizeException превышен размер репозитория
     */
    public boolean uploadFile(long authorizationKey,String relativePath, 
            ByteArray array) throws IOException,RemoteException,
            WrongKeyExeption,FileSizeException,RepositorySizeException ;

    /** 
     * Проверить явяется ли файл с заданным именем директорией
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return true если директория
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public boolean isDirectory(long authorizationKey,String relativePath)
            throws RemoteException,WrongKeyExeption ;

    /**
     * Добавить файл в репозиторий
     * @param authorizationKey авторизационный ключ
     * @param file добавляемый файл
     * @param relativePath путь относительно репозитория пользователя
     * @return true - файл создан, false - файл с таким именем уже существует
     * @throws IOException ошибка ввода/вывода при копировании файла
     * @throws FileSizeException превышен размер файла
     * @throws RepositorySizeException превышен размер репозитория
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    /*public boolean createFile (long authorizationKey, File file, String relativePath)
            throws RemoteException,WrongKeyExeption, IOException,
            FileSizeException,RepositorySizeException;*/

    /**
     * Создать папку в директории репозитория
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return true - файл создан, false - файл с таким именем уже существует
     * @throws java.rmi.RemoteException если произошла ошибка соединения
     * @throws java.io.IOException ошибка ввода/вывода при создании директории
     * @throws WrongKeyExeption неверный ключ 
     */
    public boolean createDirectory (long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption,IOException;

    /**
     * Удалить файл или директорию из репозитория.
     * Для удаления директории она должна быть пуста.
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь к файлу относительно репозитория
     * @return true - успешное удаление, false в противном случае
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public boolean deleteFile (long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption;

    /**
     * Удалить файл или директорию из репозитория.
     * В случае удаления директории удяляется и её содержимое.
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь к файлу относительно репозитория
     * @return true - успешное удаление, false в противном случае
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public boolean recurrenceDelete (long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption;

    /**
     * Обновить файл репозитория
     * @param authorizationKey авторизационный ключ
     * @param file файл-источник
     * @param relativePath путь назначения относительно репозитория пользователя
     * @throws IOException ошибка ввода/вывода при копировании файла
     * @throws FileSizeException превышен размер файла
     * @throws RepositorySizeException превышен размер репозитория
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    /*public void updateFile (long authorizationKey, File file, String relativePath)
            throws RemoteException,WrongKeyExeption, IOException,
            FileSizeException,RepositorySizeException;*/

    /**
     * Переименовать файл. Можно использовать для перемещения файла
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @param newRelativePath новый путь относительно репозитория пользователя
     * @return true в случае успеха, иначе false
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public boolean renameFile(long authorizationKey, String relativePath,
            String newRelativePath) throws RemoteException,WrongKeyExeption;

    /**
     * Провенрить существование файла или директории
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return true в случае успеха, иначе false
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public boolean exist(long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption;

    /**
     * запросить время последней модификации файла
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return время в миллисекундах с 1970. в случае внутренней ошибки -1
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public long lastModified(long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption;

    /**
     * Запросить количество файлов в папке и подпапках
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return число файлов в папке и подпапках. -1 если на relativePath не
     * существует или является файлом
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public int getFilesNumber(long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption;

    /**
     * запросить размер файла или директории
     * @param authorizationKey авторизационный ключ
     * @param relativePath путь относительно репозитория пользователя
     * @return размер файла или директории в байтах
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public long getSize(long authorizationKey, String relativePath)
            throws RemoteException,WrongKeyExeption;

    /**
     * Запросить размер репозитория
     * @param authorizationKey авторизационный ключ
     * @return размер репозитория в байтах
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public long getRepositorySize (long authorizationKey)
            throws RemoteException,WrongKeyExeption;

    /**
     * Запросить максимальный размер файла репозитория
     * @param authorizationKey авторизационный ключ
     * @return размер в байтах
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public long getMaxFileSize (long authorizationKey)
            throws RemoteException,WrongKeyExeption;

    /**
     * Запросить максимальный размер репозитория
     * @param authorizationKey авторизационный ключ
     * @return размер в байтах
     * @throws RemoteException если произошла ошибка соединения
     * @throws WrongKeyExeption неверный ключ
     */
    public long getMaxSize (long authorizationKey)
            throws RemoteException,WrongKeyExeption;
}
